﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Framework.AcessoDados.Acesso;
using Framework.Entidade.Acesso;
using Framework.Util.Enumerador;
using System.Configuration;

namespace Framework.LogicaNegocio.Acesso
{
    public class LN_Plano
    {
        #region Métodos

        /// <summary>
        /// Método responsável pela listagem de todos os Planos já cadastrados conforme filtro
        /// </summary>
        /// <param name="nome">Nome do Plano</param>
        /// <param name="status">Status do Plano</param>
        /// <returns>Lista de Objetos EN_Plano preenchidos</returns>
        public List<EN_Plano> Listar(string nome, string status)
        {
            AD_Plano objPlanoAD = new AD_Plano();
            List<EN_Plano> lstPlanos = new List<EN_Plano>();

            try
            {
                lstPlanos = objPlanoAD.Listar(nome, status);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return lstPlanos;
        }

        /// <summary>
        /// Método responsável pelo retorno do Plano desejado
        /// </summary>
        /// <param name="id">id do Plano</param>
        /// <returns>Objeto EN_Plano preenchido</returns>
        public EN_Plano RetornarPlano(int id)
        {
            AD_Plano objPlanoAD = new AD_Plano();
            EN_Plano objPlano = new EN_Plano();

            try
            {
                if (id <= 0)
                    throw new Exception("Informe o Id do Plano.");

                objPlano = objPlanoAD.RetornarPlano(id);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return objPlano;
        }

        /// <summary>
        /// Método responsável por Salvar o Plano no Banco de Dados
        /// Insere ou Altera
        /// </summary>
        /// <param name="objPlano">Objeto Plano preenchido</param>
        /// <returns>Id do Plano</returns>
        public int Salvar(EN_Plano objPlano)
        {
            AD_Plano objPlanoAD = new AD_Plano();
            int idPlano = 0;

            using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["FrameworkConnectionDev"].ConnectionString))
            {
                conn.Open();
                //Iniciando uma transação
                SqlTransaction trans = conn.BeginTransaction();

                try
                {
                    if (objPlano == null)
                        throw new Exception("Preencha as informações do Plano.");
                    if (string.IsNullOrEmpty(objPlano.Nome) == true)
                        throw new Exception("Informe o Nome do Plano.");
                    if (string.IsNullOrEmpty(objPlano.Descricao) == true)
                        throw new Exception("Informe a Descrição do Plano.");
                    if (objPlano.Valor <= 0)
                        throw new Exception("Informe o Valor do Plano.");

                    idPlano = objPlanoAD.Salvar(objPlano, conn, trans);

                    trans.Commit();
                }
                catch (Exception ex)
                {
                    trans.Rollback();
                    throw ex;
                }

                conn.Close();
            }

            return idPlano;
        }

        /// <summary>
        /// Método responsável por Excluir/Inativar o Plano desejado
        /// </summary>
        /// <param name="id">id do Plano</param>
        public void Excluir(int id)
        {
            AD_Plano objPlanoAD = new AD_Plano();

            using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["FrameworkConnectionDev"].ConnectionString))
            {
                conn.Open();
                //Iniciando uma transação
                SqlTransaction trans = conn.BeginTransaction();

                try
                {
                    if (id <= 0)
                        throw new Exception("Informe o Id do Plano.");

                    objPlanoAD.Excluir(id, conn, trans);
                    trans.Commit();
                }
                catch (Exception ex)
                {
                    trans.Rollback();
                    throw ex;
                }

                conn.Close();
            }
        }

        #endregion
    }
}
